    ; 用户库函数
    ; @author: Milon
    ; @date: 2024/04/30
    
    bits 64

bin64_to_dec:                               ; 将二进制数转换为十进制字符串。
                                            ; 输入：R8=64位二进制数
                                            ;      RBX=目标缓冲区线性地址
        push rax
        push rbx
        push rcx
        push rdx
        push r8

        mov rax, r8
        mov r8, 10
        xor rcx, rcx

    .next_div:
        xor rdx, rdx
        div r8
        push rdx                            ; 分解出的数位压栈
        inc rcx                             ; 记录分解了几次
        or rax, rax
        jz .rotate
        jmp .next_div

    .rotate:
        pop rdx                             ; 分解的数位反向弹出
        add dl, 0x30                        ; +'0'转为ASCII码
        mov [rbx], dl
        inc rbx
        loop .rotate

        mov byte [rbx], 0

        pop r8
        pop rdx
        pop rcx
        pop rbx
        pop rax
        ret


strcat:                                     ; 将源字符串连接到目的字符串的尾部
                                            ; 输入：RSI=源字符串的线性地址
                                            ;      RDI=目的字符串的线性地址
        push rsi
        push rdi
        push rax

    .r0:
        cmp byte [rdi], 0
        jz .r1
        inc rdi
        jmp .r0

    .r1:
        mov al, [rsi]
        mov [rdi], al
        cmp al, 0
        jz .return
        inc rsi
        inc rdi
        jmp .r1

    .return:
        pop rax
        pop rdi
        pop rsi
        ret


